package love.xiaohh.minio.controllers;

import love.xiaohh.minio.entities.FileStore;
import love.xiaohh.minio.entities.dto.Base64ImageUploadDTO;
import love.xiaohh.minio.services.FileStoreService;
import love.xiaohh.minio.utils.http.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

/**
 * <p>
 * 文件存取的前端控制器
 * </p>
 *
 * @author XiaoHH
 * @version 1.0
 * @date 2021-11-21 星期日 9:39:39
 * @file FileStoreController.java
 */
@RestController
@RequestMapping("/fileStore")
public class FileStoreController {

    @Autowired
    private FileStoreService fileStoreService;

    /**
     * 上传一个文件
     *
     * @param file 文件对象
     * @return 上传成功之后会返回文件的信息
     * @throws SQLException 与数据库交互的时候可能抛出的数据库异常
     */
    @PostMapping("/upload")
    public R<FileStore> upload(@RequestParam("file") MultipartFile file) throws SQLException {
        return R.success(this.fileStoreService.upload(file));
    }

    /**
     * 上传base64格式的图片的接口
     *
     * @param base64ImageUpload base64格式的图片的传输对象
     * @return 上传成功之后会返回文件的信息
     * @throws IOException 会因为解析base64、上传文件而抛出io异常
     */
    @PostMapping("/base64")
    public R<FileStore> base64(@RequestBody Base64ImageUploadDTO base64ImageUpload) throws IOException {
        return R.success(this.fileStoreService.uploadBase64(base64ImageUpload));
    }

    /**
     * 下载文件时候的uuid
     *
     * @param download 是否下载；0=在线预览,1=下载
     * @param uuid     文件的uuid
     * @param response 响应对象，由Spring向方法里面传递
     * @throws IOException 可能会抛出输入输出流异常
     */
    @GetMapping("/download/{download}/{uuid}")
    public void download(@PathVariable("download") Integer download, @PathVariable("uuid") String uuid, HttpServletResponse response) throws IOException {
        this.fileStoreService.download(download, uuid, response);
    }

    /**
     * 删除一个文件
     *
     * @param uuid 文件的uuid
     * @return 是否成功
     */
    @DeleteMapping("/{uuid}")
    public R<Void> remove(@PathVariable("uuid") String uuid) {
        this.fileStoreService.removeFileByUuid(uuid);
        return R.success();
    }
}
